import { defineStore } from 'pinia';
import { useLoginApi, type LoginForm } from '@/api/login';
import { AESEncrypt } from '@code4x/common';
import type { RemovableRef } from '@vueuse/core';
import router from '@/router';
import usePermissionStore from './permission';

export type TokenInfo = {
  /**
   * 是否已经登录
   */
  isLogin?: boolean;
  /**
   * 登录设备类型
   */
  loginDevice?: string;
  /**
   * token对应的职员ID
   */
  loginId: string;
  /**
   * 账号类型标识，emp是职员，其他待定
   */
  loginType: string;
  /**
   * token剩余有效期 (单位: 秒)
   */
  tokenTimeout: number;
  /**
   * 请求头令牌键
   */
  tokenName: string;
  /**
   * 请求头令牌值
   */
  tokenValue: string;
  /**
   * 会话超时时间
   */
  sessionTimeout?: number;
  tag?: '';
  /**
   * 令牌活动超时时间
   */
  tokenActivityTimeout?: number;
  /**
   * 令牌会话超时时间
   */
  tokenSessionTimeout?: number;
};

/**
 * 当前用户信息
 *
 * UserInfo
 */
export interface IUserInfo {
  /**
   * 登录账号
   */
  account: string;
  /**
   * 职员id
   */
  empId: string;
  /**
   * 职员姓名
   */
  empName: string;
  /**
   * 手机号
   */
  mobile?: null | string;
  /**
   * 当前登录机构
   */
  org?: { [key: string]: any };
  /**
   * 当前登录部门
   */
  orgDept?: { [key: string]: any };
  /**
   * 当前机构所有任职部门
   */
  orgDeptList?: { [key: string]: any }[] | null;
  /**
   * 所有任职机构
   */
  orgList?: { [key: string]: any }[] | null;
  /**
   * 当前登录岗位
   */
  orgPost?: { [key: string]: any };
  /**
   * 当前部门所有任职岗位
   */
  orgPostList?: { [key: string]: any }[] | null;
  /**
   * 用户id
   */
  userId?: null | string;
  /**
   * 用户头像
   */
  avatar?: string;
}

export const useLoginStore = defineStore('login', () => {
  /**
   * 令牌信息
   */
  const tokenInfo: RemovableRef<TokenInfo> | null = useStorage('tokenInfo', {
    loginId: '',
    loginType: '',
    tokenName: 'Authorization',
    tokenValue: '',
    tokenTimeout: 0,
  });
  /**
   * 登录操作
   * @param data 登录信息
   * @param encrypt 是否加密
   * @returns
   */
  const loginAction = async (data: LoginForm, encrypt: boolean = true) => {
    try {
      const res = await useLoginApi.login({
        ...data,
        pwd: encrypt
          ? AESEncrypt(data.pwd, import.meta.env.VITE_CRYPTOJS_KEY)
          : data.pwd,
      });
      tokenInfo.value = res.data;
      getUserInfo();
      await usePermissionStore().getOriginMenus();
      return res.data;
    } catch (error) {
      return Promise.reject(error);
    }
  };
  /**
   * 清除令牌
   */
  const clearToken = () => {
    tokenInfo.value = {
      loginId: '',
      loginType: '',
      tokenName: 'Authorization',
      tokenValue: '',
      tokenTimeout: 0,
    };
    router.push({
      name: 'login',
    });
  };
  /**
   * =====================用户相关信息===================
   */
  const userInfo = ref<IUserInfo>({
    empId: '',
    empName: '',
    account: '',
  });
  const getUserInfo = async () => {
    try {
      const res = await useLoginApi.getCurrentUser();
      userInfo.value = res.data;
    } catch (error) {
      console.error(error);
    }
  };
  const logout = async () => {
    try {
      await useLoginApi.logout();
      clearToken();
    } catch (error) {
      console.error(error);
    }
  };
  return { tokenInfo, loginAction, clearToken, userInfo, getUserInfo, logout };
});
